/** ****************************************************************************
@defgroup Calendar Calendar
@ingroup Share
@brief Calendar
@addtogroup Calendar
@{
*******************************************************************************/

#ifndef __CALENDAR_H
#define __CALENDAR_H

#include <stdint.h>
#include <stdbool.h>
#include "unios.h"

/// @brief 时间比较
int timeCompare(uint8_t hour1, uint8_t minute1, uint8_t second1, uint8_t hour2, uint8_t minute2, uint8_t second2);
int timeCompare2(const unios_time_t* t1, const unios_time_t* t2);
bool timeBetween(const unios_time_t* t, const unios_time_t* start, const unios_time_t* end);

/// @brief 是不是闰年
bool isLeapYear(uint16_t year);
/// @brief 这个月有多少天
uint8_t daysInMonth(uint16_t year, uint8_t month);
/// @brief 这一年有多少天
uint16_t daysInYear(uint16_t year);

/// @brief 获取相对于基准日期过去了多少个整天
uint16_t date2Days(unios_date_t *date);
/// @brief 相对于基准日期的天数转换为日期
unios_date_t days2Date(uint16_t days);

/// @brief 获取日期、时间相对于基准日期时间的秒数(绝对秒数)
uint32_t dateTime2Seconds(unios_datetime_t *dateTime);
/// @brief 绝对秒数换算成日期、时间
unios_datetime_t seconds2DateTime(uint32_t seconds);

/// @brief 转换为秒数
static inline unios_sec_t time2seconds(unios_time_t *time) {
	return time->hour * 3600 + time->minute * 60 + time->second;
}
/// @brief 秒数转换为时间
static inline unios_time_t seconds2time(unios_sec_t sec) {
	unios_time_t time = {.hour = sec / 3600, .minute = (sec % 36000) / 60, .second = sec % 60 };
	return time;
}

/// @brief 设定当前时间
#define setDateTime(dateTime) osSetClock(dateTime2Seconds(dateTime))

/// @brief 获取当前日期、时间
#define getDateTime() seconds2DateTime(osGetClock())

/// @brief 获取指定日期是星期几
uint8_t date2Weekday(unios_date_t *date);
/// @brief 获取当前是星期几
uint8_t whatDayIsToday(void);

/// @brief 日期格式化(2021-10-11 12:32:01)
/// @param timestamp 时间戳
/// @param shortYear 年份显示为2或4位
/// @param prefixZero 月/日/时/分/秒如果不足2位，是否前面补0
/// @param noDate 不要日期
/// @param noTime 不要时间
const char* getDateTimeString(uint32_t timestamp);

/// 把用 HEX 表示的十进制数字表示的时间，转换成时间戳
/// 如："\x20\x21\x08\x30\x23\x43\x53"(2021-08-30 23:43:53) => 0x612D6D39
uint32_t hexdecTime2timestamp(void *bytes);
/// 把时间戳，转换成用 HEX 表示的十进制数字表示的时间
/// 如：0x612D6D39 => "\x20\x21\x08\x30\x23\x43\x53"(2021-08-30 23:43:53)
void timestamp2hexdecTime(uint32_t timestamp, uint8_t *bytes);


#endif // __CALENDAR_H
/// @}
